package pe.com.bn.sach.calculoCuota;

import java.util.ArrayList;
import java.util.Hashtable;
import org.apache.log4j.Logger;
 
public class CostoEfectivoAnual {

	private static Logger log = Logger.getLogger(CostoEfectivoAnual.class.getName());
	
	public double CalculoCostoEfectivo(
			double tasaAnual
			,int yearPago, int monthPago, int dayPago 
			,int plazoPago
			,int diaPagoSel
			,int mesesGracia
			,int dobleJulio
			,int dobleDiciembre
			,ArrayList calculoCuotaMensual
			){
		
		
		double costoEfectivoAnual = 0.0;
		ArrayList calculoCuota = null;
	    costoEfectivoAnual = CostoEfectivo(
				tasaAnual
				,yearPago,monthPago,dayPago 
				,plazoPago
				,diaPagoSel
				,mesesGracia
				,dobleJulio
				,dobleDiciembre
				,calculoCuotaMensual
				);
	    
		return costoEfectivoAnual;
	}
	
	private double CostoEfectivo(
			double tasaAnual
			,int yearPago, int monthPago, int dayPago 
			,int plazoPago
			,int diaPagoSel
			,int mesesGracia
			,int dobleJulio
			,int dobleDiciembre
			,ArrayList calculoCuotaMensual
			){
		
		double costoEfectivoAnual = 0.0;
		
		//Obteniendo el calculo de cuota mensual para operar los factores
		/*ArrayList calculoCuotaMensual = new  ArrayList();
		calculoCuotaMensual = CalculoCuotaMensual(
				montoPrestamo
				,comisionEvaluacion 
				,tasaAnual
				,yearPago,monthPago,dayPago 
				,tasaSegDesgravMensual
				,valorInmueble
				,tasaSegInmuebleMensual
				,plazoPago
				,portes
				,diaPagoSel
				,mesesGracia
				,dobleJulio
				,dobleDiciembre
				,finanGraciaAgente);	*/
		
		Hashtable cuotafactSemilla = new Hashtable();
		cuotafactSemilla = CostoEfectivoCuotaFactor(
				tasaAnual
				,yearPago,monthPago,dayPago 
				,plazoPago
				,diaPagoSel
				,mesesGracia
				,dobleJulio
				,dobleDiciembre
				,calculoCuotaMensual
				);
		
		
		double[] totFactCuota  = null;
		totFactCuota  = (double[])cuotafactSemilla.get("totfactor");   
		
		//obteniendo el valor objetivo
		double ejecutar = 0 ;
		int iterar = 1;
		double[] desvInetres  = null;
		double[] newInteres  = new double[1];
		
		Hashtable resultado = new Hashtable();
		
		resultado = UtilCosto.evaluarIteracionFactor(
				totFactCuota
				,desvInetres
				,tasaAnual);
		
		ejecutar = ((Integer)resultado.get("ejecutar")).intValue();
		desvInetres = (double[])resultado.get("initArray");
		newInteres = (double[])resultado.get("newinteres");
		
		double errorVarianza = 0.0;
		while(ejecutar == UtilCosto.TRUE
				&& iterar <= Util.NUMERO_CORRIDAS
				&& errorVarianza != newInteres[0]
				){
			errorVarianza = newInteres[0];
			Hashtable cuotafactItera = new Hashtable();
			cuotafactItera = CostoEfectivoCuotaFactor(
					newInteres[0]
					,yearPago,monthPago,dayPago 
					,plazoPago
					,diaPagoSel
					,mesesGracia
					,dobleJulio
					,dobleDiciembre
					,calculoCuotaMensual
					);
			
			double[] totFactCuotaItera  = null;
			totFactCuotaItera  = (double[])cuotafactItera.get("totfactor");   
			
			//Obteniendo las nuevas cuotas

			Hashtable resultItera = new Hashtable();
			resultItera = UtilCosto.evaluarIteracionFactor(
					totFactCuotaItera
					,desvInetres
					,newInteres[0]);

			ejecutar = ((Integer)resultItera.get("ejecutar")).intValue();
			desvInetres = (double[])resultItera.get("initArray");
			newInteres = (double[])resultItera.get("newinteres");
			
			iterar ++;
			
		};		
		costoEfectivoAnual = newInteres[0];
		return costoEfectivoAnual;
	}
	
	
	private Hashtable CostoEfectivoCuotaFactor(
			double tasaCostoEfectivo
			,int yearPago, int monthPago, int dayPago 
			,int plazoPago
			,int diaPagoSel
			,int mesesGracia
			,int dobleJulio
			,int dobleDiciembre
			,ArrayList cuotaSemilla
			){
		
		double costoEfectivoAnual = 0.0;
		ArrayList calculoFactor = null;

	    //Obtener factores del costo efectivo
		double interesMensual = Util.calculoTEM(tasaCostoEfectivo) ;
		
		double[] factores = null;
		
		//Obteniendo el periodo de gracia
		ArrayList cuotasFactor = null; 
		if (mesesGracia != 0){
			cuotasFactor = UtilCosto.CalculoGraciaCostoEfectivo(
					mesesGracia
					,yearPago,monthPago, dayPago, diaPagoSel
					);
			//UtilCosto.printFactores(cuotasFactor);
		}else{
				
		}
	    
		Hashtable data = null;
		data = UtilCosto.factoresCostoEfectivo(
				interesMensual
				,yearPago, monthPago, dayPago
				,plazoPago
				,diaPagoSel
				,mesesGracia				
				,dobleJulio
				,dobleDiciembre
				,cuotasFactor) ;
		
		ArrayList arrFactor = null;
		factores = (double[])data.get("amortiz");
		arrFactor = (ArrayList)data.get("lista");
		
		double saldoCalc = factores[0];
		
		//UtilCosto.printFactores(arrFactor);
	    
		//Adicionando al array el calculo de la cuota * factor
		Hashtable multCuotaFact = new Hashtable();
		double[] totFactCuota = null;
		ArrayList arrFactorCuota = null;
		multCuotaFact = UtilCosto.CalcularCuotaFactor(
				cuotaSemilla
				,arrFactor
				,mesesGracia  //Gracia
				);
		
		if (multCuotaFact== null)
			return null;
		arrFactorCuota = (ArrayList)multCuotaFact.get("factorcuota");
		totFactCuota =  (double[])multCuotaFact.get("totfactor");
		Hashtable ratioCuotaFactor = new Hashtable();
		ratioCuotaFactor.put("factorcuota",arrFactorCuota);
		ratioCuotaFactor.put("totfactor",totFactCuota);
		return ratioCuotaFactor;
	}

	/*
	private ArrayList CalculoCuotaMensual(
			double montoPrestamo
			,double comisionEvaluacion 
			,double tasaAnual
			,int yearPago, int monthPago, int dayPago 
			,double tasaSegDesgravMensual
			,double valorInmueble
			,double tasaSegInmuebleMensual
			,int plazoPago
			,double portes
			,int diaPagoSel
			,int mesesGracia
			,int dobleJulio
			,int dobleDiciembre
			,int finanGraciaAgente	
			){
		
		
		//Obteniendo la multiplicidad de los factores con la cuota, para el cronograma semilla
		CalculoCuotaHipotecario hipo = new CalculoCuotaHipotecario();
		ArrayList cuotaSemilla = null;
		cuotaSemilla = hipo.CalculoPrestamoCuota(
				montoPrestamo  // Monto de Prestamo
				,comisionEvaluacion	//Comision Evaluacion
				,tasaAnual   //Tasa de interes Anual TEA
				,yearPago,monthPago,dayPago  //Fecha de Pago
				,tasaSegDesgravMensual	//Seguro de Desgravamen
				,valorInmueble //Monto del inmueble
				,tasaSegInmuebleMensual   //Tasa seguro inmueble
				,plazoPago  //Plazo
				,portes	 //portes
				,diaPagoSel	//dia pago
				,mesesGracia  //Gracia
				,dobleJulio //cuota doble julio
				,dobleDiciembre //cuota doble diciembre
				,finanGraciaAgente); //financia gracia

		Util.printCronograma(cuotaSemilla);

		return cuotaSemilla;
		
	}
	
	*/

}
